package com.itheima.controller;

import com.itheima.po.User;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * @Author Andy
 * @Description //TODO UserController
 * @Date 2022/2/27 10:24 上午
 * @Version 1.0
 **/
@Controller // 声明是一个控制器类，来处理用户的http请求
// 在企业中 类上的指定某一个业务模块 例如当前处理的是用户模块
//按照RESTful规范定义URL是 模块用英文单词复数
@RequestMapping("/users")
public class UserController {

    //    user/helloWorld
//    具体的业务
//    返回数据有两类，一类是静态资源文件，另一类数据 字符串， TRUE 数字
    @RequestMapping("/helloWorld")
    public String helloWorld() {
        System.out.println("hello world");
        return "index.jsp"; // 静态资源交给springmvc去解析
    }

    @RequestMapping("/save")
    @ResponseBody // 作用 返回数据本身 "index.jsp"就不需要springmvc去找静态资源，
    // 直接返回"index.jsp"本沈index.jsp字符串
    public String save() {
        System.out.println("save");
        return "index.jsp";
    }

    //    三种参数接收 get post
    //    URL参数
// http://localhost/user/urlParam?name=zhangsan&age=19
    @RequestMapping("/urlParam")
    @ResponseBody
    public String urlParam(String name, int age) {
        System.out.println("urlParam name = " + name);
        System.out.println("urlParam age = " + age);
        return "{'module':'成功 param'}";
    }

//    post form-urlencoded
    //    form参数 前端传过来的参数名与后端方法中的参数名相同，就可以直接接收，但是，工作是springmvc帮我们做的
    @RequestMapping("/fromParam")
    @ResponseBody
    public String fromParam(String name, int age) {
        System.out.println("fromParam name = " + name);
        System.out.println("fromParam age = " + age);
        return "{'module':'fromParam param'}";
    }

    //    http://www.baidu.com/map/query/beijing?q=昌平
//    协议    需要   【端口号80可以忽略】路径（/map/query/beijing）行业术语：uri
//    http://www.baidu.com/map/query/beijing 行业术语：url
    //    URL路径参数 要接收的url参数是一个变量，在后端接收时，给改该变量起一个名字，然后加上{}进行接收
    @RequestMapping("/map/query/{zone}")
    @ResponseBody
    public String pathBeijingParam(@PathVariable("zone") String zone) {
        System.out.println("pathParam zone = " + zone);
//        com.itheima.service com.itheima.dao
        return "{'module':'pathParam param'}";
    }

    @RequestMapping("/pathParam/{id}")
    @ResponseBody
    public String pathParam(@PathVariable("id") Integer id) {
        System.out.println("pathParam id = " + id);
        return "{'module':'pathParam param'}";
    }

//    前端传的是name 后端用userName来接受需要加@RequestParam
    @RequestMapping("/differenceRequestParam")
    @ResponseBody
    public String differenceRequestParam(
            @RequestParam(value = "name", required = false) String userName){
        System.out.println("前端传的是name 后端用userName来接受需要加@RequestParam(\"name\") "
                                   + userName);
        return "differenceRequestParam";
    }

//    前端传递URL或form表单参数，如果传递的参数名与对象的属性名相同，可以直接用对象接收
    @RequestMapping("/poParam")
    @ResponseBody
    public String poParam(User user){
        System.out.println("前端传递URL或form表单参数，如果传递的参数名与对象的属性名相同，可以直接用对象接收"+ user.getName());
        System.out.println("前端传递URL或form表单参数，如果传递的参数名与对象的属性名相同，可以直接用对象接收"+ user.getAge());
        return "po param";
    }

//    前端传递URL或form表单参数，是数组参数后端可以用数组同名参数的集合接收，但是需要在参数钱加@RequestParam
    @RequestMapping("/arrayParam")
    @ResponseBody
    public String arrayParam(String[] likes){
        if (null != likes && likes.length > 0){
            for (int i = 0; i < likes.length; i++){
                System.out.println("前端传递URL或form表单参数，是数组参数" +
                                           "，后端可以用数组同名参数的集合接收，但是需要在参数钱加@RequestParam" + likes[i]);
            }
        }
//        System.out.println("前端传递URL或form表单参数，是数组参数，后端可以用数组同名参数直接接收" + likes[0]);
//        System.out.println("前端传递URL或form表单参数，是数组参数，后端可以用数组同名参数直接接收" + likes[1]);
//        System.out.println("前端传递URL或form表单参数，是数组参数，后端可以用数组同名参数直接接收" + likes[2]);
        return "arrayParam";
    }

//    前端传递URL或form表单参数，是数组参数后端可以用数组同名参数的集合接收，但是需要在参数钱加@RequestParam
//    @RequestParam也可以用集合的接收 也可以用于名字不同时接收
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam List<String> likes){
        if (null != likes && likes.size() > 0){
            for (int i = 0; i < likes.size(); i++){
                System.out.println("前端传递URL或form表单参数，是数组参数，" +
                                           "后端可以用数组同名参数的集合接收，但是需要在参数钱加@RequestParam" + likes.get(i));
            }
        }
        return "listParam";
    }

// 当前端发送post请求，请求体数据格式是application/json,在Postman中选择raw然后选择json,
//    后端接收json请求题用@RequestBody， 后端参数名叫什么都可以
    @RequestMapping("/listBodyParam")
    @ResponseBody
    public String listBodyParam(@RequestBody List<String> likes){
        if (null != likes && likes.size() > 0){
            for (int i = 0; i < likes.size(); i++){
                System.out.println("" + likes.get(i));
            }
        }
        return "listParam";
    }


    @RequestMapping("/jsonPoParam")
    @ResponseBody
    public String jsonPoParam(@RequestBody User user){
        System.out.println("post请求传递json对象参数，对象里的属性名与json对象数据的key相同，后端参数前加@RequestBody进行接收"+ user.getName());
        System.out.println("post请求传递json对象参数，对象里的属性名与json对象数据的key相同，后端参数前加@RequestBody进行接收"+ user.getAge());
        return "jsonPoParam";
//        备注：虽然用get请求也行，但是行业规范要用post
    }

//    /user/jsonArrayParam
    @RequestMapping("/jsonArrayParam")
    @ResponseBody
    public String jsonArrayParam(@RequestBody List<User> list){
        System.out.println("前端传json对象数组，后端用list集合中泛型的属性与前端传递json对象数组中json对象的key相同，然后在" +
                                   "后端的参数前加@RequestBody注解" + list);
        return "jsonArrayParam";
    }


//    date
    @RequestMapping("/date")
    @ResponseBody
    public String date(
//            java默认日期格式
            Date date,
//            yyyy-MM-dd (前端传这钟格式字符串)
            @DateTimeFormat(pattern = "yyyy-MM-dd") Date date1,
//            yyyy/MM/dd HH:mm:ss (前端传这钟格式字符串)
            @DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss")  Date date2){
        System.out.println("前端传过来的时间字符串，如果格式不是java默认的格式（yyyy/MM/dd HH:mm:ss）" +
                                   "，那么需要在Date类型参数前使用@DateTimeFormat来指定当前" +
                                   "后端接收日期数据格式" + date);
        System.out.println("前端传过来的时间字符串，如果格式不是java默认的格式（yyyy/MM/dd HH:mm:ss）" +
                                   "，那么需要在Date类型参数前使用@DateTimeFormat来指定当前" +
                                   "后端接收日期数据格式" + date1);
        System.out.println("前端传过来的时间字符串，如果格式不是java默认的格式（yyyy/MM/dd HH:mm:ss）" +
                                   "，那么需要在Date类型参数前使用@DateTimeFormat来指定当前" +
                                   "后端接收日期数据格式" + date2);
        return "date param";
    }

    @RequestMapping("/po")
    @ResponseBody
    public User po(){
        System.out.println("po ");
        return new User("zhangsan", 19);
    }

    @RequestMapping("/poList")
    @ResponseBody
    public List<User> poList(){
        System.out.println("poList ");
        return Arrays.asList(new User("zhangsan", 19),
                             new User("lisi", 20));
    }

    @RequestMapping("/testPo")
    @ResponseBody
    public String jsonPoParamsss(@RequestBody TestPo user){
        System.out.println("post请求传递json对象参数，对象里的属性名与json对象数据的key相同，后端参数前加@RequestBody进行接收"+ user.getUsERNAME());
        System.out.println("post请求传递json对象参数，对象里的属性名与json对象数据的key相同，后端参数前加@RequestBody进行接收"+ user.getTestName());
        System.out.println("post请求传递json对象参数，对象里的属性名与json对象数据的key相同，后端参数前加@RequestBody进行接收"+ user.getATable());
        return "jsonPoParam";
//        备注：虽然用get请求也行，但是行业规范要用post
    }
}

@Data
class TestPo{
    private String usERNAME;
    private String testName;
    private String aTable;
}


















